package Biblioteca

class Livro extends Item{
	String isbn
	String editora
	String fornecedor
	
	static constraints = {
		editora(blank: false, maxSize:50, validator: {return isLetter(it)})
		isbn(unique: true, blank: false, validator: {return (verifyISBN(it))})
		fornecedor(blank: false,maxSize:50, validator: {return isLetter(it)})
	}
	
	public static boolean verifyISBN (String number){
		String isbn = number
		if (Contas.Telefone.isNumb(isbn) == true){
			if (isbn.length() == 10){
				return (verify10(isbn) &&  !existIsbn13(isbn))
			}
			if (isbn.length() == 13){
				return (verify13(isbn) && !existIsbn10(isbn)) 
			}
		}
		return false
	}
	
	public static boolean existIsbn13(String isbnEntrada){
		String isbn = ("978" + isbnEntrada.substring(0, 9))
		int soma = 0;
		for (int i = 0; i < 12; i++) {
			if (i % 2 == 0){
				soma += (Integer.parseInt (isbn.substring(i, i+1)))
			}else{
				soma += (Integer.parseInt (isbn.substring(i, i+1)) * 3)
			}
		}
		isbn += ""+(10 - (soma % 10))+""
		return (Livro.executeQuery('select isbn from Livro').contains(isbn))
	}
	
	public static boolean existIsbn10(String isbnEntrada){
		String isbn = isbnEntrada.substring(3, 12)
		int soma = 0;
		for (int i = 0; i < 9; i++) {
			soma = soma + (10 - i) * (Integer.parseInt (isbn.substring(i, i+1)))
		}
		isbn += ""+(11 - (soma % 11))+""
		return (Livro.executeQuery('select isbn from Livro').contains(isbn))
	}
	
	public static boolean verify10 (String isbn){
		int soma = 0;
		for (int i = 0; i < 9; i++) {
			soma = soma + (10 - i) * (Integer.parseInt (isbn.substring(i, i+1)))
		}
		return (11 - (soma % 11)) == (Integer.parseInt (isbn.substring(9, 10)))
	}
	
	public static boolean verify13 (String isbn){
		int soma = 0;
		for (int i = 0; i < 12; i++) {
			if (i % 2 == 0){
				soma += (Integer.parseInt (isbn.substring(i, i+1)))
			}else{
				soma += (Integer.parseInt (isbn.substring(i, i+1)) * 3)
			}
		}
		return (10 - (soma % 10)) == (Integer.parseInt (isbn.substring(12, 13)))
	}
	
	public static boolean isLetter (String name){
		def expressaoRegular = /([a-zA-Z\p{L} ]+)/
		return (name ==~ expressaoRegular)
		
	}
	
	public String toString(){
		return (this.titulo + " - " + this.isbn) 
	}
}
